package com.xthink.web.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xthink.common.result.AjaxResult;
import com.xthink.common.pojo.sys.Menu;
import com.xthink.common.vo.sys.MenuVo;
import com.xthink.web.mapper.MenuMapper;
import com.xthink.web.service.MenuService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {

    @Autowired
    private MenuMapper menuMapper;

    @Override
    public AjaxResult insertMenu(Menu menu) {

        if (menu.getParentMenuId() == null) {
            return AjaxResult.error("请设置父级");
        }


        if (!StringUtils.isNotBlank(menu.getMenuName())) {
            return AjaxResult.error("请输入标题名称");
        }

        if (!StringUtils.isNotBlank(menu.getPath())) {
            return AjaxResult.error("请输入规则");
        }

        if (!StringUtils.isNotBlank(menu.getIcon())) {
            return AjaxResult.error("请选择图标");
        }

        if (!StringUtils.isNotBlank(menu.getSysLeve())) {
            return AjaxResult.error("请输入权重");
        }

        int insert = menuMapper.insert(menu);
        if (insert == 0) {
            return AjaxResult.error("新建失败");
        }
        return AjaxResult.success();
    }

    @Override
    public AjaxResult updateMenu(Menu menu) {
        if (menu.getParentMenuId() == null) {
            return AjaxResult.error("请设置父级");
        }

        if (!StringUtils.isNotBlank(menu.getMenuName())) {
            return AjaxResult.error("请输入标题名称");
        }

        if (!StringUtils.isNotBlank(menu.getPath())) {
            return AjaxResult.error("请输入规则");
        }

        if (!StringUtils.isNotBlank(menu.getIcon())) {
            return AjaxResult.error("请选择图标");
        }

        if (!StringUtils.isNotBlank(menu.getSysLeve())) {
            return AjaxResult.error("请输入权重");
        }

        LambdaUpdateWrapper<Menu> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(Menu::getId, menu.getId())
                .set(Menu::getParentMenuId, menu.getParentMenuId())
                .set(Menu::getMenuName, menu.getMenuName())
                .set(Menu::getPath, menu.getPath())
                .set(Menu::getIcon, menu.getIcon())
                .set(Menu::getSysLeve, menu.getSysLeve())
                .set(StringUtils.isNotBlank(menu.getRemark()), Menu::getRemark, menu.getRemark());
        int update = menuMapper.update(menu, wrapper);
        if (update == 0) {
            return AjaxResult.error("修改失败");
        }
        return AjaxResult.success();
    }

    @Override
    public AjaxResult deleteMenu(Integer id) {
        LambdaUpdateWrapper<Menu> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(Menu::getId, id).set(Menu::getDelFlag, 1);
        int update = menuMapper.update(null, wrapper);
        if (update == 0) {
            return AjaxResult.error("删除失败");
        }
        return AjaxResult.success();
    }

    @Override
    public AjaxResult listMenu() {
        QueryWrapper<Menu> wrapper = new QueryWrapper<>();
        List<Menu> allMenu = menuMapper.selectList(wrapper);

        //创建MenuVo
        List<MenuVo> menuVos = new ArrayList<>();
        for (Menu value : allMenu) {
            MenuVo menuVo = new MenuVo();
            BeanUtils.copyProperties(value, menuVo);
            menuVos.add(menuVo);
        }

        //新建一个List存储根节点的数据
        List<MenuVo> rootMenu = new ArrayList<>();
        //遍历所有的数据，如果这个数据的parentId为0，说明它是根数据，把它放到根数据的数组里
        for (MenuVo menuVo : menuVos) {
            if (menuVo.getParentMenuId() == 0) {
                rootMenu.add(menuVo);
            }
        }
        //遍历所有的根数据
        for (MenuVo menu : rootMenu) {
            //新建一个专门存孩子数据的数组，通过getChild方法将这个id的孩子存到ChildMenu（实体类中有专门存孩子数据的字段）中
            List<MenuVo> childMenu = getChild(menu.getId(), menuVos);
            //将返回来的孩子数组添加到孩子字段中
            menu.setChildMenu(childMenu);
        }
        //返回所有的根数据(根数据中有孩子数据的字段)
        return AjaxResult.success(menuVos);
    }

    //getChild方法，通过id获得这个id的实体类的所有孩子数据
    public List<MenuVo> getChild(Integer id, List<MenuVo> menuVos) {
        //新建一个存储孩子数据的数组
        ArrayList<MenuVo> childMenu = new ArrayList<>();
        //遍历所有的数据，当数据的父亲id和要判断的id相同的时候，就找到了它的孩子数据，将这个孩子数据添加进孩子数组中
        for (MenuVo menuVo : menuVos) {
            if (id == menuVo.getParentMenuId()) {
                childMenu.add(menuVo);
            }
        }
        //遍历所有的孩子数组，目的是把孩子数组的孩子数组也添加上
        //递归思想
        for (MenuVo menu : childMenu) {
            //直接把孩子数据调用的getChild方法返回的其孩子数据（孩子数据的孩子数据）直接添加到字段中
            menu.setChildMenu(getChild(menu.getId(), menuVos));
        }
        //递归结束条件,当孩子数组为空时
        if (childMenu.size() == 0) {
            //返回空数组
            return new ArrayList<MenuVo>();
        }
        //返回孩子数组
        return childMenu;
    }

}
